package com.example.demo.controller;

import com.example.demo.bean.User;
import com.example.demo.dao.UserMapper;
import com.example.demo.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class UserController {
    private static String nowname;     //当前的用户名，用于删除缓存以及更新缓存时使用
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private RedisUtils redisUtils;
/*
* 登录，以及防止缓存击穿
* */
    @RequestMapping("/login")                     //为了方便演示，先用thmyleaf模板e
    public String login(User user, Model model){
        boolean passA=redisUtils.hasKey("user_"+user.getUsername());
        if(passA){                                                     //先检查缓存
            User user2= (User) redisUtils.get("user_"+user.getUsername());
            if(user2.getPassword().equals(user.getPassword())){
                model.addAttribute("message","利用缓存,登录成功!") ;
                nowname=user2.getUsername();                     //将当前的名字给nowname,方便后续的删除缓存
                model.addAttribute("username",nowname);  //把名字传到前端，用于更新操作的时候用
                return "main.html";
            }else {
                model.addAttribute("message","和缓存里的密码不一致,登录失败!");
                return "index.html";
            }
        }else{                                            //缓存不存在就去数据库
            User user2=userMapper.login(user);
            if(user2!=null){
                redisUtils.set("user_"+user.getUsername(),user2);  //设置缓存,存user2是因为里面还有id
                model.addAttribute("message","利用数据库登录成功");
                nowname=user2.getUsername();                     //将当前的名字给nowname,方便后续的删除缓存
                model.addAttribute("username",nowname);  //把名字传到前端，用于更新操作的时候用
                return "main.html";
            }else{
                user.setPassword("error");        //将数据库没有的信息，处理过也放入缓存，防止它一直登录，造成数据库压力即缓存击穿!
                                                  //同时为了防止用户得到处理过的密码，可以设置加密的或者注册登录时密码不少于6位!
                redisUtils.set("user_"+user.getUsername(),user);
                model.addAttribute("message","账号密码和数据库不一致，登录失败!");
                return "index.html";
            }
        }
    }
    /*
     * 修改，采用cache aside的方式进行mysql和redis的同步
     * */
    @RequestMapping("toupdate")                          //登录成功后才能修改，这里也可以使用token验证，传token，解密出username!
                                                         //登录成功后肯定有缓存，所以先在缓存查出来
                                                         //同时可以设置拦截器，防止直接访问toupdate
    public String toupdate(String username,Model model){
        User user= (User) redisUtils.get("user_"+username);
        model.addAttribute("user",user);                  //因为是登陆成功才能改，只需要在缓存中查找用户信息，显示到前端，注意id为hidden
        return "update.html";
    }

    @RequestMapping("/doupdate")                 //Cache Aside-变异2:先将数据的改变操作(创建、更新、删除）应用到Mysql数据库中；然后在缓存执行相应的数据改变操作(创建、删除、更新)
    public String doupdate(User user,Model model){
        int i=userMapper.updateUser(user);
        if(i>0){
            redisUtils.del("user_"+nowname);                  //先删除当前的信息，防止更新用户名的时候，原先的缓存信息仍然生效
            redisUtils.set("user_"+user.getUsername(),user);         //给缓存也更新一下
            nowname=user.getUsername();                              //得到最新的名字!防止修改两次时,还是删原来的nowname
            model.addAttribute("message","修改成功!");
            return "update.html";
        }else{
            model.addAttribute("message","修改失败!");
            return "update.html";
        }
    }
    /*
     * 删除，注册（增加）和更新的逻辑一样!!
     * */


}
